Don't strip exteriour quotes from fields. From Mottram.
authorrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Tue, 3 Jun 2003 20:50:05 +0000 (20:50 +0000)
committerrobertl <robertl@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Tue, 3 Jun 2003 20:50:05 +0000 (20:50 +0000)
gpsbabel/csv_util.c
gpsbabel/csv_util.h
gpsbabel/internal_styles.c
gpsbabel/style/mxf.style
gpsbabel/tmpro.c
gpsbabel/xcsv.c

index 2c2cba10fd661f941b17e6160da4a12960c9e869..9d3c7701ab36fbdb024603f10c4409f9fab90fc4 100644 (file)
@@ -83,19 +83,20 @@ csv_stringclean(const char *string, const char *chararray)
 /***********************************************************************************/
 /* csv_stringtrim() - trim whitespace and leading and trailing enclosures (quotes) */
 /*                    returns a copy of the modified string                        */
-/*    usage: p = csv_stringtrim(string, "\"")                                      */
+/*    usage: p = csv_stringtrim(string, "\"", 0)                                   */
 /***********************************************************************************/
 char *
 #ifdef DEBUG_MEM
-CSV_STRINGTRIM(const char *string, const char *enclosure,DEBUG_PARAMS)
+CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS)
 #else
-csv_stringtrim(const char *string, const char *enclosure)
+csv_stringtrim(const char *string, const char *enclosure, int strip_max)
 #endif
 {
     static const char *p1 = NULL;
     char *p2 = NULL;
     char * tmp = xxstrdup(string,file,line);
     size_t elen;
+    int stripped = 0;
 
     if (!strlen(string)) {
        return (tmp);
@@ -120,13 +121,19 @@ csv_stringtrim(const char *string, const char *enclosure)
        p1++;
     }
 
+    /* if no maximum strippage, assign a reasonable value to max */
+    strip_max = strip_max ? strip_max : 9999;
+
     /* if we have enclosures, skip past them in pairs */
     if (elen) {
-       while (((size_t) (p2 - p1) > elen) &&
+       while (
+              (stripped < strip_max) &&
+              ((size_t) (p2 - p1) > elen) &&
               (strncmp(p1, enclosure, elen) == 0) &&
               (strncmp((p2 - elen + 1), enclosure, elen) == 0)) {
            p2 -= elen;
             p1 += elen;
+            stripped++;
        }
     }
 
@@ -394,22 +401,22 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp)
        /* IGNORE -- Calculated Sequence # For Ouput*/
     } else
     if (strcmp(fmp->key, "SHORTNAME") == 0) {
-       wpt->shortname = csv_stringtrim(s, "");
+       wpt->shortname = csv_stringtrim(s, "", 0);
     } else
     if (strcmp(fmp->key, "DESCRIPTION") == 0) {
-       wpt->description = csv_stringtrim(s, "");
+       wpt->description = csv_stringtrim(s, "", 0);
     } else
     if (strcmp(fmp->key, "NOTES") == 0) {
-       wpt->notes = csv_stringtrim(s, "");
+       wpt->notes = csv_stringtrim(s, "", 0);
     } else
     if (strcmp(fmp->key, "URL") == 0) {
-       wpt->url = csv_stringtrim(s, "");
+       wpt->url = csv_stringtrim(s, "", 0);
     } else
     if (strcmp(fmp->key, "URL_LINK_TEXT") == 0) {
-       wpt->url_link_text = csv_stringtrim(s, "");
+       wpt->url_link_text = csv_stringtrim(s, "", 0);
     } else
     if (strcmp(fmp->key, "ICON_DESCR") == 0) {
-       wpt->icon_descr = csv_stringtrim(s, "");
+       wpt->icon_descr = csv_stringtrim(s, "", 0);
        wpt->icon_descr_is_dynamic = 1;
     } else
 
index cd0d19acdec1ab1cabaeb9a29734c7a7d1441384..a0bd4c09b6ec96fffd24be952fbae1229a903841 100644 (file)
@@ -21,9 +21,9 @@
 
 char *
 #ifndef DEBUG_MEM
-csv_stringtrim(const char *string, const char *enclosure);
+csv_stringtrim(const char *string, const char *enclosure, int strip_max);
 #else
-CSV_STRINGTRIM(const char *string, const char *enclosure, DEBUG_PARAMS);
+CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS);
 #define csv_stringtrim( s, e ) CSV_STRINGTRIM( s, e, __FILE__, __LINE__);
 #endif
 
index abb612bd8668207126eff0bc2c82c7dcca4e75b8..b16d338502c9578129439685004839104d76a632 100644 (file)
@@ -237,7 +237,7 @@ static char mxf[] =
 "#\n"
 "FIELD_DELIMITER               COMMASPACE\n"
 "RECORD_DELIMITER      NEWLINE\n"
-"BADCHARS              COMMA\n"
+"BADCHARS              \",\n"
 
 "#\n"
 "# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n"
@@ -253,8 +253,8 @@ static char mxf[] =
 "OFIELD        LAT_DECIMAL, \"\", \"%08.5f\"\n"
 "OFIELD        LON_DECIMAL, \"\", \"%08.5f\"\n"
 "OFIELD        DESCRIPTION, \"\", \"\"%s\"\"\n"
-"OFIELD        SHORTNAME, \"\", \"%s\"\n"
-"OFIELD        DESCRIPTION, \"\", \"%s\"\n"
+"OFIELD        SHORTNAME, \"\", \"\"%s\"\"\n"
+"OFIELD        DESCRIPTION, \"\", \"\"%s\"\"\n"
 "OFIELD        CONSTANT, \"ff0000\", \"%s\"    # COLOR\n"
 "OFIELD        CONSTANT, \"47\", \"%s\"                # ICON\n"
 ;
index 44643f1a2c92999fe584c185e9f432e98ada276f..e0229b792469d41a1d153004203629e7855906ee 100644 (file)
@@ -17,7 +17,7 @@ EXTENSION             mxf
 #
 FIELD_DELIMITER                COMMASPACE
 RECORD_DELIMITER       NEWLINE
-BADCHARS               COMMA
+BADCHARS               ",
 
 #
 # INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:
@@ -33,7 +33,7 @@ IFIELD        CONSTANT, "47", "%s"            # ICON
 OFIELD LAT_DECIMAL, "", "%08.5f"
 OFIELD LON_DECIMAL, "", "%08.5f"
 OFIELD DESCRIPTION, "", ""%s""
-OFIELD SHORTNAME, "", "%s"
-OFIELD DESCRIPTION, "", "%s"
+OFIELD SHORTNAME, "", ""%s""
+OFIELD DESCRIPTION, "", ""%s""
 OFIELD CONSTANT, "ff0000", "%s"        # COLOR
 OFIELD CONSTANT, "47", "%s"            # ICON
index 379f65ae3c5e7d952d0fe2c0da91a31af6b2cb5f..32bc6f812f3430a884930c08b0c51a53d91a2875 100644 (file)
@@ -107,13 +107,13 @@ data_read(void)
                         /* ignore: group  */
                         break;
                case 1:
-                   wpt_tmp->shortname = csv_stringtrim(s, "");
+                   wpt_tmp->shortname = csv_stringtrim(s, "", 0);
                    break;
                case 2:
                        /* Description is not a TopoMapPro format requirement.
                           If we assign "" then .loc/.gpx will generate empty XML tags :(
                        */
-                       holder = csv_stringtrim(s, "");
+                       holder = csv_stringtrim(s, "", 0);
                        if (strlen(holder))
                        wpt_tmp->description = holder;
                    break;
@@ -145,7 +145,7 @@ data_read(void)
                           use the TopoMapLinks links.
                           (plus discards length 0 strings (so no empty XML tags))
                        */
-                       holder = csv_stringtrim(s, "");
+                       holder = csv_stringtrim(s, "", 0);
                        if (strstr(holder, "http:") != NULL)
                                wpt_tmp->url = holder;
                        break;
index f17d713cf8eb7fd73b8b08de671a7828520dc1bb..e3edbecc864f8b46affd06422a8a1d132d5c5ff8 100644 (file)
@@ -190,7 +190,7 @@ xcsv_parse_style_line(const char *sbuff)
 
     if (strlen(sbuff)) {
        if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) {
-           sp = csv_stringtrim(&sbuff[16], "\"");
+           sp = csv_stringtrim(&sbuff[16], "\"", 1);
            cp = get_char_from_constant_table(sp);
            if (cp) {
                xcsv_file.field_delimiter = xstrdup(cp);
@@ -201,7 +201,7 @@ xcsv_parse_style_line(const char *sbuff)
        } else
 
        if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) {
-           sp = csv_stringtrim(&sbuff[17], "\"");
+           sp = csv_stringtrim(&sbuff[17], "\"", 1);
            cp = get_char_from_constant_table(sp);
            if (cp) {
                xcsv_file.record_delimiter = xstrdup(cp);
@@ -212,11 +212,11 @@ xcsv_parse_style_line(const char *sbuff)
        } else
 
        if (ISSTOKEN(sbuff, "DESCRIPTION")) {
-               xcsv_file.description = csv_stringtrim(&sbuff[11],"");
+               xcsv_file.description = csv_stringtrim(&sbuff[11],"", 0);
        } else
 
        if (ISSTOKEN(sbuff, "EXTENSION")) {
-               xcsv_file.extension = csv_stringtrim(&sbuff[10],"");
+               xcsv_file.extension = csv_stringtrim(&sbuff[10],"", 0);
        } else
 
        if (ISSTOKEN(sbuff, "SHORTLEN")) {
@@ -230,7 +230,7 @@ xcsv_parse_style_line(const char *sbuff)
        } else
 
        if (ISSTOKEN(sbuff, "BADCHARS")) {
-           sp = csv_stringtrim(&sbuff[9], "\"");
+           sp = csv_stringtrim(&sbuff[9], "\"", 1);
            cp = get_char_from_constant_table(sp);
            if (cp) {
                xcsv_file.badchars = xstrdup(cp);
@@ -258,15 +258,15 @@ xcsv_parse_style_line(const char *sbuff)
                switch(i) {
                case 0:
                    /* key */
-                   key = csv_stringtrim(s, "\"");
+                   key = csv_stringtrim(s, "\"", 1);
                    break;
                case 1:
                    /* default value */
-                   val = csv_stringtrim(s, "\"");
+                   val = csv_stringtrim(s, "\"", 1);
                    break;
                case 2:
                    /* printf conversion */
-                   pfc = csv_stringtrim(s, "\"");
+                   pfc = csv_stringtrim(s, "\"", 1);
                    break;
                default:
                    break;
@@ -295,15 +295,15 @@ xcsv_parse_style_line(const char *sbuff)
                switch(i) {
                case 0:
                    /* key */
-                   key = csv_stringtrim(s, "\"");
+                   key = csv_stringtrim(s, "\"", 1);
                    break;
                case 1:
                    /* default value */
-                   val = csv_stringtrim(s, "\"");
+                   val = csv_stringtrim(s, "\"", 1);
                    break;
                case 2:
                    /* printf conversion */
-                   pfc = csv_stringtrim(s, "\"");
+                   pfc = csv_stringtrim(s, "\"", 1);
                    break;
                default:
                    break;